package com.kingyun.gpsinspection.purificationservice.services.iam.innerservice.adm.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cqhilink.api.common.utils.UniqueUtil;
import com.kingyun.gpsinspection.purificationservice.dao.mapper.iam.TaskLinkIamMapper;
import com.kingyun.gpsinspection.purificationservice.facade.model.BootstrapSearchBean;
import com.kingyun.gpsinspection.purificationservice.facade.model.iam.adm.AutoApply;
import com.kingyun.gpsinspection.purificationservice.facade.model.iam.adm.BusinessTravel;
import com.kingyun.gpsinspection.purificationservice.facade.model.iam.adm.TaskLinkIam;
import com.kingyun.gpsinspection.purificationservice.facade.model.iam.adm.VacationApply;
import com.kingyun.gpsinspection.purificationservice.facade.service.iam.accessory.BPMService;
import com.kingyun.gpsinspection.purificationservice.facade.service.iam.adm.AutoApplyService;
import com.kingyun.gpsinspection.purificationservice.facade.service.iam.adm.BusinessTravelService;
import com.kingyun.gpsinspection.purificationservice.facade.service.iam.adm.TaskLinkIamService;
import com.kingyun.gpsinspection.purificationservice.facade.service.iam.adm.VacationApplyService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import java.util.*;

/**
 * @version V1.0
 * @Package com.cqhilink.iot.integratedapplicationmanagement.services.innerservice.adm.impl
 * @Description: 任务环节实现
 * @author: lutianbo
 * @date: 2017/1/16,0016
 */

public class TaskLinkIamServiceImpl implements TaskLinkIamService{
    @Autowired
    public TaskLinkIamMapper taskIamMapper;
    @Autowired
    public VacationApplyService vacationApplyService;
    @Autowired
    public BusinessTravelService travelService;
    @Autowired
    public AutoApplyService autoApplyService;
    @Autowired
    private BPMService bpmService;
    @Value("#{configProperties['baseURL']}")
    private String baseURL;
    // 查询名称
    @Value("#{configProperties['queryName']}")
    private String queryName;
    // 代办
    @Value("#{configProperties['awaitTask']}")
    private String awaitTask;
    // 出差
    @Value("#{configProperties['travel_bpdid']}")
    private String travel_bpdid;
    // 请假
    @Value("#{configProperties['vacation_bpdid']}")
    private String vacation_bpdid;
    // 用车
    @Value("#{configProperties['car_bpdid']}")
    private String car_bpdid;
    // 流程名称
    @Value("#{configProperties['iamProcessAppName']}")
    private String processAppName;

    /**
     * 查询任务环节
     * @param task
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> list(TaskLinkIam task) throws Exception {
        Map<String, Object> map = new HashMap<>();
        task.setLimit( task.getLimit() == null ? 10 : task.getLimit() );
        task.setOffset( task.getOffset() == null ? 0 : task.getOffset() );
        map.put("total",taskIamMapper.queryCount(task));
        List<TaskLinkIam> list=taskIamMapper.queryList(task);
        map.put("rows", list);
        return map;
    }

    /**
     * 新增任务环节
     * @param task
     * @throws Exception
     */
    @Override
    public void taskLinkAdd(TaskLinkIam task) throws Exception {
        //添加任务环节
        task.setTaskLinkId(UniqueUtil.uuid());
        task.setExecuteTime(new Date());
        task.setUserId("41EF70AB2B819B17E050A8C0BA00FCBE");
        taskIamMapper.insertSelective(task);
    }

    /**
     *保存任务环节
     * @param task 任务环节
     * @param result json结果集
     * @param taskType 任务类型 0：休假 1出差 2用车
     * @param id 主键id
     * @param note 节点位置
     * @return
     */
    @Override
    public TaskLinkIam save( TaskLinkIam task, String result, Short taskType, String id, Short note){
        JSONObject resultObj=JSONObject.parseObject(result);
        System.out.println("》》》》》》》retObj" + resultObj);
        // 获取data属性的值
        JSONObject dataObj=(JSONObject)resultObj.get("data");
        // 获取tasks属性的值
        JSONArray itemsArray=(JSONArray)dataObj.get("tasks");
        // 循环json数组
        if(itemsArray != null){
            for (int i = 0; i < itemsArray.size(); i++) {
                // 获取得到json对象
                JSONObject ob  = (JSONObject) itemsArray.get(i);
                // piid这里是列名称，获取json对象中列名为piid的值  流程实例ID
                task.setPiPiid(ob.getString("piid"));
                // tkiid这里是列名称，获取json对象中列名为tkiid的值 任务节点ID
                task.setTkiid(ob.getString("tkiid"));
                // name这里是列名称，获取json对象中列名为name的值 节点名称
                task.setTaskLinkName(ob.getString("name"));
            }
        }
        // 任务类型
        task.setTaskType(taskType);
        // 任务ID
        task.setTaskId(id);
        // 节点
        task.setNode(note);
        // 任务环节id
        task.setTaskLinkId(UniqueUtil.uuid());
        // 执行时间
        task.setExecuteTime(new Date());
        // 保存业务环节
        taskIamMapper.insertSelective(task);
        return  task;
    }

    /**
     * 分页显示待办任务
     * @param task 任务对象
     * @param type 0:休假 1：出差 2：用车
     * @return
     * @throws Exception
     */
    @Override
    public JSONObject listToDoTask(BootstrapSearchBean bootstrapSearchBean, TaskLinkIam task, int type, String username, String password) throws Exception {
        // 分页展示的JOSONObject
        JSONObject showObject = new JSONObject();
        String queryFilter="";
        // 休假
        if(type==0){
            queryFilter="PT_PTID=ID('"+vacation_bpdid+"')";
         // 出差
        }else if(type==1){
            queryFilter="PT_PTID=ID('"+travel_bpdid+"')";
         // 用车
        }else if(type==2){
            queryFilter="PT_PTID=ID('"+car_bpdid+"')";
        }
        String result = bpmService.queryBPM(baseURL, queryName, null, awaitTask, queryFilter, null, processAppName,
                null, null, null, null, "GET", username, password);
        JSONObject resultObj = JSONObject.parseObject(result);
        System.out.println("》》》》》》》》》resultObj"+resultObj);
        if(null == resultObj){
            // 总条数
            showObject.put("total", 0);
            showObject.put("rows", null);
            return  showObject;
        }
        // 获取data属性的值
        JSONObject dataObj = (JSONObject) resultObj.get("data");
        // 获取items属性的值
        JSONArray itemsArray = (JSONArray) dataObj.get("items");
        // 如果没有代办则返回
        if(itemsArray.size()==0){
            JSONObject  object = new JSONObject();
            return object;
        }
        Integer limit = task.getLimit() == null ? 10 : task.getLimit();
        Integer offset = task.getOffset() == null ? 0 : task.getOffset();

        // 分页展示的JOSONArray
        JSONArray showArray = new JSONArray();
        // 分页：遍历itemsArray
        // 分页原理：当前页有数据，必然itemsArray.size()>offset
        if (itemsArray.size() > offset && itemsArray.size() >= offset + limit) { //23 > 10+10
            for (int i = offset; i < offset + limit; i++) {
                showArray.add(itemsArray.get(i));
            }
        } else if (itemsArray.size() > offset && itemsArray.size() < offset + limit) { //23<20+10
            for (int i = offset; i < itemsArray.size(); i++) {
                showArray.add(itemsArray.get(i));
            }
        } else if (itemsArray.size() <= offset) {
            //23<=30
        }


        int total=0;

        //showObject.put("rows", showArray);
        JSONObject myjObject;
        Map map;
        // 流程实例id集合 用于查找数据库中相对应的代办数据
        List<String> searchList=new ArrayList<>();
        // 封装根据流程实例id 集合
        for(int i = 0;i<itemsArray.size();i++){
             myjObject = itemsArray.getJSONObject(i);
             map = myjObject;
             searchList.add(map.get("PI_PIID").toString());
        }
        Map<String,Object> filterMap = bootstrapSearchBean.getFilterMap()!=null? bootstrapSearchBean.getFilterMap():new HashMap<>() ;
        filterMap.put("PIID",searchList);
        List<Object> retList = new ArrayList<>();
        // 设置查询参数
        bootstrapSearchBean.setFilterMap(filterMap);
        String PIID="";
        TaskLinkIam taskLinkIam;
        // 休假
        VacationApply vacationApply;
        // 用车
        AutoApply autoApply;
        // 出差
        BusinessTravel businessTravel;
        // 休假
        if(type==0){
            total = vacationApplyService.totalCountByPIId(bootstrapSearchBean);
            retList = vacationApplyService.searchByPIId(bootstrapSearchBean);
            // 休假代办列表查询
            // 数据组装
            for(int i=0;i<retList.size();i++){
                taskLinkIam= new TaskLinkIam();
                vacationApply=(VacationApply)retList.get(i);
                for(int j=0;j<itemsArray.size();j++){
                    myjObject = itemsArray.getJSONObject(j);
                    map = myjObject;
                    PIID=map.get("PI_PIID").toString();
                    // 若 bpm中的流程实例id与数据库中的数据对应，则封装数据
                    if(vacationApply.getPiPiid().equals(PIID)){
                        // 设置流程实例id
                        taskLinkIam.setPiPiid(PIID);
                        // 设置任务标识
                        taskLinkIam.setTkiid(map.get("TKIID").toString());
                        // 设置节点名称
                        taskLinkIam.setTaskLinkName(map.get("NAME").toString());
                        // 设置操作人员角色
                       //  taskLinkIam.setRole(map.get("ASSIGNED_TO_ROLE_DISPLAY_NAME").toString());
                        vacationApply.setTaskLinkIam(taskLinkIam);
                        break;
                    }

                }
            }
        // 出差
        }else if(type==1){
            total = travelService.totalCountByPIId(bootstrapSearchBean);
            // 出差代办列表
            retList = travelService.searchByPIId(bootstrapSearchBean);
            // 数据组装
            for (int i = 0; i < retList.size(); i++) {
                taskLinkIam= new TaskLinkIam();
                businessTravel = (BusinessTravel) retList.get(i);
                for (int j = 0; j < itemsArray.size(); j++) {
                    myjObject = itemsArray.getJSONObject(j);
                    map = myjObject;
                    PIID = map.get("PI_PIID").toString();
                    // 若 bpm中的流程实例id与数据库中的数据对应，则封装数据
                    if (businessTravel.getPiPiid().equals(PIID)){
                        // 设置流程实例id
                        taskLinkIam.setPiPiid(PIID);
                        // 设置任务标识
                        taskLinkIam.setTkiid(map.get("TKIID").toString());
                        // 设置节点名称
                        taskLinkIam.setTaskLinkName(map.get("NAME").toString());
                        // 设置操作人员角色
                        //taskLinkIam.setRole(map.get("ASSIGNED_TO_ROLE_DISPLAY_NAME").toString());
                        businessTravel.setTaskLinkIam(taskLinkIam);
                        break;
                    }
                }
            }
        // 用车
        }else if(type==2){
            //总条数
             total = autoApplyService.totalCountByPIId(bootstrapSearchBean);
            // 用车代办列表
            retList = autoApplyService.searchByPIId(bootstrapSearchBean);
            // 数据组装
            for (int i = 0; i < retList.size(); i++) {
                taskLinkIam= new TaskLinkIam();
                autoApply = (AutoApply) retList.get(i);
                for (int j = 0; j < itemsArray.size(); j++){
                    myjObject = itemsArray.getJSONObject(j);
                    map = myjObject;
                    PIID = map.get("PI_PIID").toString();
                    // 若 bpm中的流程实例id与数据库中的数据对应，则封装数据
                    if (autoApply.getPiPiid().equals(PIID)){
                        // 设置流程实例id{
                        taskLinkIam.setPiPiid(PIID);
                        // 设置任务标识
                        taskLinkIam.setTkiid(map.get("TKIID").toString());
                        // 设置节点名称
                        taskLinkIam.setTaskLinkName(map.get("NAME").toString());
                        // 设置操作人员角色
                        //taskLinkIam.setRole(map.get("ASSIGNED_TO_ROLE_DISPLAY_NAME").toString());
                        autoApply.setTaskLinkIam(taskLinkIam);
                        break;
                    }
                }
            }
        }
        // 总条数
        showObject.put("total", total);
        showObject.put("rows", retList);
        return showObject;
    }

    /**
     * 根据任务id查询记录
     * @param taskId
     * @param node
     * @return
     */
    @Override
    public List<TaskLinkIam> queryLogByTaskIdAndNode(String taskId,Short node){
        Map<String,Object> map = new HashMap<>();
        map.put("taskId",taskId);
        map.put("node",node);
        List<TaskLinkIam> taskLinkIams = taskIamMapper.queryLogByTaskIdAndNode(map);
       return taskLinkIams;
    }

    /**
     * 根据指定id查询代办任务标识
     * @param username 用户名
     * @param password 密码
     * @param piid 任务id
     * @return
     */
    @Override
    public String queryBPMByPiid(String username,String password,String piid){
        String pid="";
        if(StringUtils.isNotBlank(piid)){
            pid="PI_PIID=ID('"+piid+"')";
        }
        String result = bpmService.queryBPM(baseURL, queryName, null, awaitTask, pid, null, processAppName,
                null, null, null, null, "GET", username, password);
        if(StringUtils.isBlank(result)){
            return null;
        }
        JSONObject resultObj = JSONObject.parseObject(result);
        // 获取data属性的值
        JSONObject dataObj = (JSONObject) resultObj.get("data");
        // 获取items属性的值
        JSONArray itemsArray = (JSONArray) dataObj.get("items");
        if(itemsArray.size()<=0){
            return null;
        }
        JSONObject myjObject=itemsArray.getJSONObject(0);
        Map map = myjObject;
        return map.get("TKIID").toString();
    }

}
